<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ConstantesCarry
 *
 * @author peyet
 */
class CarryUtils {
	private static $etape_1 = array(
		array("issaient", "", 0),
		array("ellement", "el", 0),
		array("issement", "", 0),
		array("alement", "al", 0),
		array("eraient", "", 0),
		array("iraient", "", 0),
		array("eassent", "", 0),
		array("ussent", "", 0),
		array("amment", "", 0),
		array("emment", "", 0),
		array("issant", "", 0),
		array("issent", "", 0),
		array("assent", "", 0),
		array("eaient", "", 0),
		array("issait", "", 0),
		array("èrent", "", 0),
		array("erent", "", 0),
		array("irent", "", 0),
		array("erait", "", 0),
		array("irait", "", 0),
		array("iront", "", 0),
		array("eront", "", 0),
		array("ement", "", 0),
		array("aient", "", 0),
		array("îrent", "", 0),
		array("eont", "", 0),
		array("eant", "", 0),
		array("eait", "", 0),
		array("ient", "", 0),
		array("ent", "", 0),
		array("ont", "", 0),
		array("ant", "", 0),
		array("eât", "", 0),
		array("ait", "", 0),
		array("at", "", 0),
		array("ât", "", 0),
		array("it", "", 0),
		array("ît", "", 0),
		array("t", "", 0),
		array("uction", "", 0),
		array("ication", "", 1),
		array("iation", "", 1),
		array("ation", "", 1),
		array("ition", "", 0),
		array("tion", "", 0),
		array("er", "", 0),
		array("ir", "", 0),
		array("r", "", 0),
		array("eassiez", "", 0),
		array("issiez", "", 0),
		array("assiez", "", 0),
		array("ussiez", "", 0),
		array("issez", "", 0),
		array("assez", "", 0),
		array("eriez", "", 0),
		array("iriez", "", 0),
		array("erez", "", 0),
		array("irez", "", 0),
		array("iez", "", 0),
		array("ez", "", 0),
		array("erai", "", 0),
		array("irai", "", 0),
		array("eai", "", 0),
		array("ai", "", 0),
		array("i", "", 0),
		array("ira", "", 0),
		array("era", "", 0),
		array("ea", "", 0),
		array("a", "", 0),
		array("f", "v", 0),
		array("yeux", "oeil", 0),
		array("eux", "", 0),
		array("aux", "al", 0),
		array("x", "", 0),
		array("issante", "", 0),
		array("eresse", "", 0),
		array("eante", "", 0),
		array("easse", "", 0),
		array("eure", "", 0),
		array("esse", "", 0),
		array("asse", "", 0),
		array("ance", "", 0),
		array("ence", "", 0),
		array("aise", "", 0),
		array("euse", "", 0),
		array("oise", "", 0),
		array("isse", "", 0),
		array("ante", "", 0),
		array("ouse", "ou", 0),
		array("ière", "", 0),
		array("ete", "", 0),
		array("ète", "", 0),
		array("iere", "", 0),
		array("erie", "", 0),
		array("étude", "", 0),
		array("etude", "", 0),
		array("itude", "", 0),
		array("ade", "", 0),
		array("isme", "", 0),
		array("age", "", 0),
		array("trice", "", 0),
		array("cque", "c", 0),
		array("que", "c", 0),
		array("eille", "eil", 0),
		array("elle", "", 0),
		array("able", "", 0),
		array("iste", "", 0),
		array("ulle", "ul", 0),
		array("gue", "g", 0),
		array("ette", "", 0),
		array("nne", "n", 0),
		array("itée", "", 0),
		array("ité", "", 0),
		array("té", "", 0),
		array("ée", "", 0),
		array("é", "", 0),
		array("usse", "", 0),
		array("aise", "", 0),
		array("ate", "", 0),
		array("ite", "", 0),
		array("ee", "", 0),
		array("e", "", 0),
		array("issements", "", 0),
		array("issantes", "", 0),
		array("ications", "", 1),
		array("eassions", "", 0),
		array("eresses", "", 0),
		array("issions", "", 0),
		array("assions", "", 0),
		array("iations", "", 1),
		array("issants", "", 0),
		array("ussions", "", 0),
		array("ements", "", 0),
		array("eantes", "", 0),
		array("issons", "", 0),
		array("assons", "", 0),
		array("easses", "", 0),
		array("études", "", 0),
		array("etudes", "", 0),
		array("itudes", "", 0),
		array("issais", "", 0),
		array("irions", "", 0),
		array("erions", "", 0),
		array("ateurs", "", 1),
		array("ations", "", 1),
		array("usses", "", 0),
		array("tions", "", 0),
		array("ances", "", 0),
		array("entes", "", 0),
		array("teurs", "", 1),
		array("eants", "", 0),
		array("ables", "", 0),
		array("irons", "", 0),
		array("irais", "", 0),
		array("ences", "", 0),
		array("ients", "", 0),
		array("ieres", "", 0),
		array("eures", "", 0),
		array("aires", "", 0),
		array("erons", "", 0),
		array("esses", "", 0),
		array("euses", "", 0),
		array("ulles", "ul", 0),
		array("cques", "", 0),
		array("elles", "", 0),
		array("ables", "", 0),
		array("istes", "", 0),
		array("aises", "", 0),
		array("asses", "", 0),
		array("isses", "", 0),
		array("oises", "o", 0),
		array("tions", "", 0),
		array("ouses", "ou", 0),
		array("ières", "", 0),
		array("eries", "", 0),
		array("antes", "", 0),
		array("ismes", "", 0),
		array("erais", "", 0),
		array("eâtes", "", 0),
		array("eâmes", "", 0),
		array("itées", "", 0),
		array("ettes", "", 0),
		array("ages", "", 0),
		array("eurs", "", 0),
		array("ents", "", 0),
		array("ètes", "", 0),
		array("etes", "", 0),
		array("ions", "", 0),
		array("ités", "", 0),
		array("îtés", "", 0),
		array("eurs", "", 0),
		array("iers", "", 0),
		array("iras", "", 0),
		array("eras", "", 0),
		array("ures", "", 1),
		array("ants", "", 0),
		array("îmes", "", 0),
		array("ûmes", "", 0),
		array("âmes", "", 0),
		array("ades", "", 0),
		array("eais", "", 0),
		array("eons", "", 0),
		array("ques", "c", 0),
		array("gues", "g", 0),
		array("nnes", "n", 0),
		array("ttes", "", 0),
		array("îtes", "", 0),
		array("tés", "", 0),
		array("ons", "", 0),
		array("ais", "", 0),
		array("ées", "", 0),
		array("ees", "", 0),
		array("ats", "", 0),
		array("eas", "", 0),
		array("ts", "", 0),
		array("rs", "", 0),
		array("as", "", 0),
		array("es", "", 0),
		array("fs", "v", 0),
		array("és", "", 0),
		array("is", "", 0),
		array("s", "", 0),
		array("ea", "", 0),
		array("au", "", 0)
	);


	private static $etape_2 = array(
		array("ent", "", 1),
		array("ation", "", 1),
		array("ition", "", 1),
		array("tion", "", 1),
		array("el", "", 1),
		array("i", "", 0)
	);

	private static $etape_3 = array(
		array("nn", "n", 0),
		array("ll", "l", 0),
		array("tt", "t", 0),
		array("y", "", 0),
		array("t", "", 0),
		array("qu", "c", 0),
		array("gu", "g", 0),
		array("issaient", "", 0),
		array("ellement", "el", 0),
		array("issement", "", 0),
		array("alement", "al", 0),
		array("eraient", "", 0),
		array("iraient", "", 0),
		array("eassent", "", 0),
		array("ussent", "", 0),
		array("amment", "", 0),
		array("emment", "", 0),
		array("issant", "", 0),
		array("issent", "", 0),
		array("assent", "", 0),
		array("eaient", "", 0),
		array("issait", "", 0),
		array("èrent", "", 0),
		array("erent", "", 0),
		array("irent", "", 0),
		array("erait", "", 0),
		array("irait", "", 0),
		array("iront", "", 0),
		array("eront", "", 0),
		array("ement", "", 0),
		array("aient", "", 0),
		array("îrent", "", 0),
		array("eont", "", 0),
		array("eant", "", 0),
		array("eait", "", 0),
		array("ient", "", 0),
		array("ent", "", 0),
		array("ont", "", 0),
		array("ant", "", 0),
		array("eât", "", 0),
		array("ait", "", 0),
		array("at", "", 0),
		array("ât", "", 0),
		array("it", "", 0),
		array("ît", "", 0),
		array("t", "", 0),
		array("uction", "", 0),
		array("ication", "", 1),
		array("iation", "", 1),
		array("ation", "", 1),
		array("ition", "", 0),
		array("tion", "", 0),
		array("ateur", "", 0),
		array("teur", "", 1),
		array("ier", "", 0),
		array("er", "", 0),
		array("ir", "", 0),
		array("r", "", 0),
		array("eassiez", "", 0),
		array("issiez", "", 0),
		array("assiez", "", 0),
		array("ussiez", "", 0),
		array("issez", "", 0),
		array("assez", "", 0),
		array("eriez", "", 0),
		array("iriez", "", 0),
		array("erez", "", 0),
		array("irez", "", 0),
		array("iez", "", 0),
		array("ez", "", 0),
		array("erai", "", 0),
		array("irai", "", 0),
		array("eai", "", 0),
		array("ai", "", 0),
		array("i", "", 0),
		array("ira", "", 0),
		array("era", "", 0),
		array("ea", "", 0),
		array("a", "", 0),
		array("f", "v", 0),
		array("yeux", "oeil", 0),
		array("eux", "", 0),
		array("aux", "al", 0),
		array("x", "", 0),
		array("issante", "", 0),
		array("eresse", "", 0),
		array("eante", "", 0),
		array("easse", "", 0),
		array("eure", "", 0),
		array("esse", "", 0),
		array("asse", "", 0),
		array("ance", "", 0),
		array("ence", "", 0),
		array("aise", "", 0),
		array("oise", "", 0),
		array("isse", "", 0),
		array("ante", "", 0),
		array("ouse", "ous", 0),
		array("ière", "", 0),
		array("esse", "", 0),
		array("ete", "", 0),
		array("ète", "", 0),
		array("aire", "", 0),
		array("ure", "", 1),
		array("erie", "", 0),
		array("étude", "", 0),
		array("etude", "", 0),
		array("itude", "", 0),
		array("ade", "", 0),
		array("isme", "", 0),
		array("age", "", 0),
		array("trice", "", 0),
		array("cque", "c", 0),
		array("que", "c", 0),
		array("eille", "eil", 0),
		array("elle", "", 0),
		array("able", "", 0),
		array("iste", "", 0),
		array("ulle", "ul", 0),
		array("gue", "g", 0),
		array("ette", "", 0),
		array("nne", "n", 0),
		array("itée", "", 0),
		array("ité", "", 0),
		array("té", "", 0),
		array("ée", "", 0),
		array("é", "", 0),
		array("usse", "", 0),
		array("aise", "", 0),
		array("ate", "", 0),
		array("ite", "", 0),
		array("ee", "", 0),
		array("e", "", 0),
		array("issements", "", 0),
		array("issantes", "", 0),
		array("ications", "", 1),
		array("eassions", "", 0),
		array("eresses", "", 0),
		array("issions", "", 0),
		array("assions", "", 0),
		array("iations", "", 1),
		array("issants", "", 0),
		array("ussions", "", 0),
		array("ements", "", 0),
		array("eantes", "", 0),
		array("issons", "", 0),
		array("assons", "", 0),
		array("easses", "", 0),
		array("études", "", 0),
		array("etudes", "", 0),
		array("itudes", "", 0),
		array("issais", "", 0),
		array("trices", "", 0),
		array("eilles", "eil", 0),
		array("irions", "", 0),
		array("erions", "", 0),
		array("ateurs", "", 1),
		array("ations", "", 1),
		array("usses", "", 0),
		array("tions", "", 0),
		array("ances", "", 0),
		array("entes", "", 0),
		array("teurs", "", 1),
		array("eants", "", 0),
		array("ables", "", 0),
		array("irons", "", 0),
		array("irais", "", 0),
		array("ences", "", 0),
		array("ients", "", 0),
		array("ieres", "", 0),
		array("eures", "", 0),
		array("aires", "", 0),
		array("erons", "", 0),
		array("esses", "", 0),
		array("euses", "", 0),
		array("ulles", "ul", 0),
		array("cques", "c", 0),
		array("elles", "", 0),
		array("ables", "", 0),
		array("istes", "", 0),
		array("aises", "", 0),
		array("asses", "", 0),
		array("isses", "", 0),
		array("oises", "o", 0),
		array("tions", "", 0),
		array("ouses", "ou", 0),
		array("ières", "", 0),
		array("eries", "", 0),
		array("antes", "", 0),
		array("ismes", "", 0),
		array("erais", "", 0),
		array("eâtes", "", 0),
		array("eâmes", "", 0),
		array("itées", "", 0),
		array("ettes", "", 0),
		array("ages", "", 0),
		array("eurs", "", 0),
		array("ents", "", 0),
		array("ètes", "", 0),
		array("etes", "", 0),
		array("ions", "", 0),
		array("ités", "", 0),
		array("ites", "", 0),
		array("ates", "", 0),
		array("îtes", "", 0),
		array("eurs", "", 0),
		array("iers", "", 0),
		array("iras", "", 0),
		array("eras", "", 0),
		array("ures", "", 1),
		array("ants", "", 0),
		array("îmes", "", 0),
		array("ûmes", "", 0),
		array("âmes", "", 0),
		array("ades", "", 0),
		array("eais", "", 0),
		array("eons", "", 0),
		array("ques", "c", 0),
		array("gues", "g", 0),
		array("nnes", "n", 0),
		array("ttes", "", 0),
		array("îtes", "", 0),
		array("tés", "", 0),
		array("ons", "", 0),
		array("ais", "", 0),
		array("ées", "", 0),
		array("ees", "", 0),
		array("ats", "", 0),
		array("eas", "", 0),
		array("ts", "", 0),
		array("rs", "", 0),
		array("as", "", 0),
		array("es", "", 0),
		array("fs", "v", 0),
		array("és", "", 0),
		array("is", "", 0),
		array("s", "", 0),
		array("eau", "", 0),
		array("au", "", 0),
		array("ent", "", 1),
		array("ation", "", 1),
		array("ition", "", 1),
		array("tion", "", 1),
		array("el", "", 1),
		array("i", "", 0),
		array("nn", "n", 0),
		array("ll", "l", 0),
		array("tt", "t", 0),
		array("y", "", 0),
		array("t", "", 0),
		array("qu", "c", 0),
		array("gu", "g", 0)
	);
	
	private static function hasSufix($mot, $suffixe) {
		$temp = strlen($mot) - strlen($suffixe);
		
		return $suffixe === "" || (($temp) >= 0 && strpos($mot, $suffixe, $temp) !== FALSE);
	}
	
	public static function getM($mot) {
		$nb_voyelles = 0;
		$nb_consonnes = 0;
		
		for ($i = 0; $i < strlen($mot); $i++) {
			if ($mot[$i] == 'a' ||
					$mot[$i] == 'e' ||
					$mot[$i] == 'i' ||
					$mot[$i] == 'o' ||
					$mot[$i] == 'u') {
				$nb_voyelles++;
			} else {
				$nb_consonnes++;
			}
		}
		
		return min(array($nb_consonnes, $nb_voyelles));
	}
	
	public static function getRacine($mot) {
		// Etape 1
		$current_suffixe = "";
		$apply_rules = false;
		$nouveau_mot = $mot;
		
		foreach (self::$etape_1 as $rule) {
			if (self::hasSufix($mot, $rule[0]) && 
					strlen($current_suffixe) < strlen($rule[0])) {
				$length_racine = strlen($mot) - strlen($rule[0]);
				$nouveau_mot = substr($mot, 0, $length_racine) . $rule[1];
				
				if (self::getM($nouveau_mot) > $rule[2]) {
					$current_suffixe = $rule[0];
					$apply_rules = true;
				}
			}
		}
		
		if ($apply_rules) {
			$mot = $nouveau_mot;
		}
		
		// Etape 2
		$current_suffixe = "";
		$apply_rules = false;
		$nouveau_mot = $mot;
		
		foreach (self::$etape_2 as $rule) {
			if (self::hasSufix($mot, $rule[0]) && 
					strlen($current_suffixe) < strlen($rule[0])) {
				$length_racine = strlen($mot) - strlen($rule[0]);
				$nouveau_mot = substr($mot, 0, $length_racine) . $rule[1];
				
				if (self::getM($nouveau_mot) > $rule[2]) {
					$current_suffixe = $rule[0];
					$apply_rules = true;
				}
			}
		}
		
		if ($apply_rules) {
			$mot = $nouveau_mot;
		}
		
		// Etape 3
		$current_suffixe = "";
		$apply_rules = false;
		$nouveau_mot = $mot;
		
		foreach (self::$etape_3 as $rule) {
			if (self::hasSufix($mot, $rule[0]) && 
					strlen($current_suffixe) < strlen($rule[0])) {
				$length_racine = strlen($mot) - strlen($rule[0]);
				$nouveau_mot = substr($mot, 0, $length_racine) . $rule[1];
				
				if (self::getM($nouveau_mot) > $rule[2]) {
					$current_suffixe = $rule[0];
					$apply_rules = true;
				}
			}
		}
		
		if ($apply_rules) {
			$mot = $nouveau_mot;
		}
		
		return $mot;
	}
}